package br.com.edumobi.activities;

import android.content.Intent;
import android.os.Bundle;
import android.speech.RecognizerIntent;

import java.util.ArrayList;
import java.util.List;

import br.com.edumobi.P;
import br.com.edumobi.R;
import br.com.edumobi.dados.modelos.Classificacao;
import br.com.edumobi.dados.modelos.Questao;
import br.com.edumobi.fragments.MEQuestaoFragment;

public class MEQuestaoActivity extends GenericaActivity implements MEQuestaoFragment.AcoesMEQuestaoFragment {

    public static final String EXTRA_CLASSIFICACAO = "EXTRA_CLASSIFICACAO";
    public static final String EXTRA_INDEX_QUESTAO_SELECIONADA = "EXTRA_INDEX_QUESTAO_SELECIONADA";
    public static final String EXTRA_USO_ASSISTENTE = "EXTRA_USO_ASSISTENTE";

    private final int VOICE_ACTION_REQUEST_CODE = 1;

    private MEQuestaoFragment meQuestaoFragment;

    private List<String> comandos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_me_questao);

        meQuestaoFragment = (MEQuestaoFragment) getFragmentManager().findFragmentById(R.id.fragmentMEQuestaoMEQuestaoActivity);

        comandos = new ArrayList<String>();
        comandos.add("a");
        comandos.add("b");
        comandos.add("c");
        comandos.add("d");
        comandos.add("repita");
        comandos.add("sair");
        comandos.add("parar");
        comandos.add("lista");
        comandos.add("amor");
        comandos.add("bola");
        comandos.add("casa");
        comandos.add("dado");
        comandos.add("morra");
    }

    @Override
    public void onBackPressed() {
        goListaDeQuestoes();
    }

    @Override
    public List<Questao> getQuestoes() {
        return local.consultarQuestoesPorClassificacao((Classificacao) getIntent().getSerializableExtra(EXTRA_CLASSIFICACAO));
    }

    @Override
    public int getIndexQuestaoSelecionada() {
        return getIntent().getIntExtra(EXTRA_INDEX_QUESTAO_SELECIONADA, P.INT_NULL);
    }

    @Override
    public void onSalvarResposta(Questao questao) {
        local.alterarQuestao(questao, (Classificacao) getIntent().getSerializableExtra(EXTRA_CLASSIFICACAO));
    }

    @Override
    public void goListaDeQuestoes() {
        Intent intent = new Intent(this, MEQuestoesActivity.class);
        intent.putExtra(MEQuestoesActivity.EXTRA_CLASSIFICACAO, getIntent().getSerializableExtra(EXTRA_CLASSIFICACAO));
        intent.putExtra(MEQuestoesActivity.EXTRA_USO_ASSISTENTE, getIntent().getBooleanExtra(EXTRA_USO_ASSISTENTE, false));
        startActivity(intent);
        finish();
    }

    @Override
    public void goResultado() {
        aguardar();
        Intent intent = new Intent(this, MEResultadoActivity.class);
        intent.putExtra(MEResultadoActivity.EXTRA_CLASSIFICACAO, getIntent().getSerializableExtra(EXTRA_CLASSIFICACAO));
        intent.putExtra(MEResultadoActivity.EXTRA_USO_ASSISTENTE, getIntent().getBooleanExtra(EXTRA_USO_ASSISTENTE, false));
        startActivity(intent);
        finish();
    }

    @Override
    public void getVoiceAction() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 6);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getResources().getString(R.string.pergunta_qual_sua_resposta));
        startActivityForResult(intent, VOICE_ACTION_REQUEST_CODE);
    }

    @Override
    public boolean getUsuAssistente() {
        return getIntent().getBooleanExtra(EXTRA_USO_ASSISTENTE, false);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == VOICE_ACTION_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {
                int indexComando = -1;

                for (String resultado : data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)) {
                    resultado = resultado.toLowerCase();
                    if (comandos.contains(resultado)) {
                        indexComando = comandos.indexOf(resultado);
                    }
                }

                switch (indexComando) {
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                        meQuestaoFragment.pronunciarResposta(indexComando);
                        break;
                    case 4:
                        meQuestaoFragment.repetirPronunciaQuestao();
                        break;
                    case 5:
                    case 6:
                        onSpeak(R.string.certo_vamos_parar);
                        aguardar();
                        finish();
                        break;
                    case 7:
                        goListaDeQuestoes();
                        break;
                    case 8:
                        meQuestaoFragment.pronunciarResposta(0);
                        break;
                    case 9:
                        meQuestaoFragment.pronunciarResposta(1);
                        break;
                    case 10:
                        meQuestaoFragment.pronunciarResposta(2);
                        break;
                    case 11:
                        meQuestaoFragment.pronunciarResposta(3);
                        break;
                    case 12:
                        onSpeak(R.string.mal_educado);
                        aguardar();
                        finish();
                        break;
                    default:
                        onSpeak(R.string.desculpe_nao_entendi_repita_por_favor);
                        aguardar();
                        getVoiceAction();
                        break;
                }
            } else {
                onSpeak(R.string.desculpe_nao_entendi_vamos_tentar_novamente);
                meQuestaoFragment.repetirPronunciaQuestao();
            }
        }
    }

    private void aguardar() {
        while (true) {
            if (!isSpeaking()) {
                break;
            }
        }
    }
}